#include "InetAddress.h"
#include <stdexcept>
#include <iostream>


InetAddress::InetAddress()
{

}

// 监听socket的构造函数
InetAddress::InetAddress(const std::string &ip, uint16_t port)
{
    memset(&addr_, 0, sizeof(addr_));
    addr_.sin_family = AF_INET;
    addr_.sin_port = htons(port);
    
    // 使用 inet_pton 替代 inet_addr（更安全，支持IPv6）
    if (inet_pton(AF_INET, ip.c_str(), &addr_.sin_addr) <= 0) {
        throw std::runtime_error("Invalid IP address format: " + ip);
    }
}

// 客户端连接的构造函数
InetAddress::InetAddress(const sockaddr_in &addr) : addr_(addr)
{
}

// 析构函数
InetAddress::~InetAddress()
{
    // 无动态资源需要释放
}

// 使用 inet_ntop 安全地转换IP地址
std::string InetAddress::ip() const
{
    char ip_buffer[INET_ADDRSTRLEN];
    const char* result = inet_ntop(AF_INET, &addr_.sin_addr, ip_buffer, INET_ADDRSTRLEN);
    
    if (result == nullptr) {
        return "0.0.0.0"; // 转换失败时返回默认值
    }
    return std::string(ip_buffer);
}

// 获取端口号
uint16_t InetAddress::port() const
{
    return ntohs(addr_.sin_port);
}

// 获取sockaddr指针
const sockaddr* InetAddress::addr() const
{
    return (sockaddr*)&addr_;
}



void InetAddress::setAddr(sockaddr_in peerAddr)
{
    this->addr_ = peerAddr;
}